org 0x7c00
[bits 16]
xor ax, ax ; eax = 0
; 初始化段寄存器, 段地址全部设为0
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax

; 初始化栈指针
mov sp, 0x7c00
mov ax, 0xb800
mov gs, ax

;清屏
mov ah, 15
int 10h

mov ah, 0
int 10h

;初始化光标位置
  mov ah, 02h
  mov dh, 2
  mov dl, 0
  mov di, 1 ;向下
  mov si, 1 ;向右
  int 10h
  
  mov bl, 0x01 ;初始颜色
  mov cx, 1
  mov bh, 0

loop:
  
  mov cx, 1
printleft:
  mov ah, 02h ;设置光标位置
  int 10h

  mov ah, 09h
  int 10h
  
;对称位置
symmetry:
  sub dh, 25
  neg dh
  sub dl, 80  
  neg dl
  
  mov ah, 02h ;设置光标位置
  int 10h
  
printright:
  mov ah, 09h ;打印字符
  int 10h
  
;复原
  sub dh, 25
  neg dh
  sub dl, 80
  neg dl
  
dhplus:
  cmp si, 0
  jl dhminus ;向左则行数--
  add dh, 1
  cmp dh, 25
  jl dlplus ;行数小于25，则列数++
  neg si ;行数大于等于25，则反向
  sub dh, 1
  
dhminus:
  sub dh, 1
  cmp dh, 0
  jg dlplus ;行数大于0，则列数++
  neg si ;行数小于等于0，则反向
  
dlplus:
  cmp di, 0
  jl dlminus ;di小于0,则列数--
  add dl, 1
  cmp dl, 80
  jl colourchange ;列数小于80,则数字改变
  neg di ;列数大于等于80,则反向
  sub dl, 1
  
dlminus:
  sub dl, 1
  cmp dl, 0
  jg colourchange ;列数大于0,则数字改变
  neg di ; 列数小于等于0,则反向
  
colourchange:
  cmp bl, 0xdf
  ja setcolour ;无符号比较jump above
  add bl, 03h
  jmp numberchange
setcolour:
  mov bl, 0x01 ; 重置颜色
  
numberchange:
  cmp al, '9'
  je zero
  add al,1
  jmp delay
zero:
  mov al, '0'
  

  
delay:
  mov ah, 86h ;delay
  mov cx, 0x01
  int 15h
  
  jmp loop
  
  jmp $ ; 死循环


times 510 - ($ - $$) db 0
db 0x55, 0xaa
